package done.easy_801_900;

import org.junit.Test;

import static com.study.util.LogUtil.info;
import static java.lang.Math.min;

/**
 * 892. Surface Area of 3D Shapes 三维形体的表面积
 * <p>
 * 在 N * N 的网格上，我们放置一些 1 * 1 * 1  的立方体。
 * 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
 * 返回结果形体的总表面积。
 * <p>
 * 示例 1：
 * 输入：[[2]]
 * 输出：10
 * 示例 2：
 * 输入：[[1,2],[3,4]]
 * 输出：34
 * 示例 3：
 * 输入：[[1,0],[0,2]]
 * 输出：16
 * 示例 4：
 * 输入：[[1,1,1],[1,0,1],[1,1,1]]
 * 输出：32
 * 示例 5：
 * 输入：[[2,2,2],[2,1,2],[2,2,2]]
 * 输出：46
 *
 * @author 大硕
 * 2019-04-12 11:25 PM
 **/
@SuppressWarnings("all")
public class SurfaceAreaOf3DShapes {

    public int surfaceArea(int[][] grid) {
        // 190415 first
        return -1;
    }

    @Test
    public void test() {
        int[][] grid = new int[][]{{1, 2},
                {3, 4}};
        info("34 -> {}", surfaceArea(grid));

        int[][] grid2 = new int[][]{{2, 2, 2},
                {2, 1, 2},
                {2, 2, 2}};
        info("46 -> {}", surfaceArea(grid2));
    }
}














































/*
public int surfaceArea(int[][] grid) {
    int area=0;
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[i].length; j++) {

            // 完全无遮挡的总面积, 4侧面 + 1顶 + 1底
            if (grid[i][j] != 0)
                area += grid[i][j] * 4 + 2;

            // 左边重合的部分，因为块数最小值就是重合面数
            // 所以谁块数少减去谁的块数
            // NO.1 左面
            if (i >= 1)
                area -= min(grid[i][j], grid[i-1][j]);

            // NO.2 上面
            if (j >= 1)
                area -= min(grid[i][j], grid[i][j-1]);

            // NO.3 右面
            if (i < grid.length - 1)
                area -= min(grid[i+1][j], grid[i][j]);

            // NO.4 下面
            if (j < grid[i].length - 1)
                area -= min(grid[i][j], grid[i][j+1]);
        }
    }
    return area;
}
*/
